package cl.mt.data;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Collection;
import java.util.LinkedList;

import cl.mt.dto.DTORemolque;
import cl.mt.util.bd.DatosTabla;
import cl.mt.util.bd.Parametro;

public class DataRemolque extends DatosTabla {
	private static final String sqlGetId = "SELECT MAX(ID)+1 AS IDX FROM MASTRANSPORTE.MST_REMOLQUES";
	private static final String sqlFindByPK = "SELECT ID, RMT_ID, PLT_ID, ELIMINADO, USR_ID, PATENTE, ANIO_FABRICACION, OBSERVACIONES, GPS, FECHA_PUBLICACION, ESTADO, CARGA, UNT_ID FROM MASTRANSPORTE.MST_REMOLQUES where ID=?";
	private static final String sqlFindAll = "SELECT ID, RMT_ID, PLT_ID, ELIMINADO, USR_ID, PATENTE, ANIO_FABRICACION, OBSERVACIONES, GPS, FECHA_PUBLICACION, ESTADO, CARGA, UNT_ID FROM MASTRANSPORTE.MST_REMOLQUES";
	private static final String sqlCreate = "INSERT INTO MASTRANSPORTE.MST_REMOLQUES (ID, RMT_ID, PLT_ID, ELIMINADO, USR_ID, PATENTE, ANIO_FABRICACION, OBSERVACIONES, GPS, FECHA_PUBLICACION, ESTADO, CARGA, UNT_ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
//	private static final String sqlDeleteByPK = "DELETE FROM MASTRANSPORTE.MST_REMOLQUES where ID=?";
	private static final String sqlDeleteByPK = "UPDATE MASTRANSPORTE.MST_REMOLQUES SET ELIMINADO='S' where ID=?";
	private static final String sqlUpdate = "UPDATE MASTRANSPORTE.MST_REMOLQUES SET RMT_ID=?, PLT_ID=?, ELIMINADO=?, USR_ID=?, PATENTE=?, ANIO_FABRICACION=?, OBSERVACIONES=?, GPS=?, FECHA_PUBLICACION=?, ESTADO=?, CARGA=?, UNT_ID=? where ID=?";
	private static final String sqlFindAllByIdUsuario = "SELECT ID, RMT_ID, PLT_ID, ELIMINADO, USR_ID, PATENTE, ANIO_FABRICACION, OBSERVACIONES, GPS, FECHA_PUBLICACION, ESTADO, CARGA, UNT_ID FROM MASTRANSPORTE.MST_REMOLQUES where USR_ID=?";
	private static final String sqlFindVigenteByIdUsuario = "SELECT ID, RMT_ID, PLT_ID, ELIMINADO, USR_ID, PATENTE, ANIO_FABRICACION, OBSERVACIONES, GPS, FECHA_PUBLICACION, ESTADO, CARGA, UNT_ID FROM MASTRANSPORTE.MST_REMOLQUES where USR_ID=? AND ELIMINADO='N'";


	private DTORemolque setDatosRegistro(ResultSet rs) throws SQLException {
		DTORemolque dto = new DTORemolque();
		dto.setId(formatInteger(rs.getObject("ID")));
		dto.setIdTipoRemolque(formatInteger(rs.getObject("RMT_ID")));
		dto.setIdTipoPlataforma(formatInteger(rs.getObject("PLT_ID")));
		dto.setEliminado(formatString(rs.getObject("ELIMINADO")));
		dto.setIdUsuario(formatInteger(rs.getObject("USR_ID")));
		dto.setPatente(formatString(rs.getObject("PATENTE")));
		dto.setAnoFabricacion(formatInteger(rs.getObject("ANIO_FABRICACION")));
		dto.setObservaciones(formatString(rs.getObject("OBSERVACIONES")));
		dto.setGps(formatString(rs.getObject("GPS")));
		dto.setFechaPublicacion(formatDate(rs.getDate("FECHA_PUBLICACION")));
		dto.setEstado(formatString(rs.getObject("ESTADO")));
		dto.setCarga(formatInteger(rs.getObject("CARGA")));
		dto.setIdTipoUnidad(formatInteger(rs.getObject("UNT_ID")));
		return dto;
	}

	public Integer generateId() {
		Parametro[] params = null;
		Integer id = null;
		try {
			getConnection();
			ResultSet rs = executeQuery(sqlGetId, params);
			while (rs.next()) {
				id = formatInteger(rs.getObject("IDX"));
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}
		return id;
	}
	public DTORemolque findByPrimaryKey(Integer id) {

		DTORemolque dto = new DTORemolque();
		Parametro[] params = new Parametro[] { getParametro(id, Types.INTEGER)};
		try {
			getConnection();

			ResultSet rs = executeQuery(sqlFindByPK, params);
			while (rs.next()) {
				dto = setDatosRegistro( rs );
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return dto;
	}

	public Collection<DTORemolque> findAll() {

		Parametro[] params = null;
		Collection<DTORemolque> col = new LinkedList<DTORemolque>();
		try {
			getConnection();

			ResultSet rs = executeQuery(sqlFindAll, params);
			while (rs.next()) {
				DTORemolque dto = setDatosRegistro( rs );
				col.add( dto );
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return col;
	}

	public int deleteByPrimaryKey(Integer id) {

		Parametro[] params = new Parametro[] { getParametro(id, Types.INTEGER)};
		int res = -1;
		try {
			getConnection();
			res = executeUpdate(sqlDeleteByPK, params);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return res;
	}

	public int create(DTORemolque dto) {

		Parametro[] params = new Parametro[] {
			getParametro(dto.getId(), Types.INTEGER),
			getParametro(dto.getIdTipoRemolque(), Types.INTEGER),
			getParametro(dto.getIdTipoPlataforma(), Types.INTEGER),
			getParametro(dto.getEliminado(), Types.VARCHAR),
			getParametro(dto.getIdUsuario(), Types.INTEGER),
			getParametro(dto.getPatente(), Types.VARCHAR),
			getParametro(dto.getAnoFabricacion(), Types.INTEGER),
			getParametro(dto.getObservaciones(), Types.VARCHAR),
			getParametro(dto.getGps(), Types.VARCHAR),
			getParametro(formatTimestamp(dto.getFechaPublicacion()), Types.TIMESTAMP),
			getParametro(dto.getEstado(), Types.VARCHAR),
			getParametro(dto.getCarga(), Types.INTEGER),
			getParametro(dto.getIdTipoUnidad(), Types.INTEGER)
		};

		int res = -1;
		try {
			getConnection();
			res = executeUpdate(sqlCreate, params);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return res;
	}

	public int update(DTORemolque dto) {

		Parametro[] params = new Parametro[] {
			getParametro(dto.getIdTipoRemolque(), Types.INTEGER),
			getParametro(dto.getIdTipoPlataforma(), Types.INTEGER),
			getParametro(dto.getEliminado(), Types.VARCHAR),
			getParametro(dto.getIdUsuario(), Types.INTEGER),
			getParametro(dto.getPatente(), Types.VARCHAR),
			getParametro(dto.getAnoFabricacion(), Types.INTEGER),
			getParametro(dto.getObservaciones(), Types.VARCHAR),
			getParametro(dto.getGps(), Types.VARCHAR),
			getParametro(formatTimestamp(dto.getFechaPublicacion()), Types.TIMESTAMP),
			getParametro(dto.getEstado(), Types.VARCHAR),
			getParametro(dto.getCarga(), Types.INTEGER),
			getParametro(dto.getIdTipoUnidad(), Types.INTEGER),
			getParametro(dto.getId(), Types.INTEGER)
		};

		int res = -1;
		try {
			getConnection();
			res = executeUpdate(sqlUpdate, params);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return res;
	}

	public Collection<DTORemolque> findByUsuario(Integer idUsuario, boolean vigente) {
		Parametro[] params = new Parametro[] { getParametro(idUsuario, Types.INTEGER)};
		Collection<DTORemolque> col = new LinkedList<DTORemolque>();
		try {
			getConnection();
			String sqlFinal = vigente ? sqlFindVigenteByIdUsuario : sqlFindAllByIdUsuario; 
			ResultSet rs = executeQuery(sqlFinal, params);
			while (rs.next()) {
				DTORemolque dto = setDatosRegistro( rs );
				col.add( dto );
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}
		return col;
	}



}

